package org.algorithm.biubiu.wheel_1.栈.第1周;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

/**
 * @date 2022-04-09 星期六 00:00
 * 堆盘子。设想有一堆盘子，堆太高可能会倒下来。因此，在现实生活中，盘子堆到一定高度时，我们就会另外堆一堆盘子。请实现数据结构SetOfStacks，模拟这种行为。SetOfStacks应该由多个栈组成，并且在前一个栈填满时新建一个栈。此外，SetOfStacks.push()和SetOfStacks.pop()应该与普通栈的操作方法相同（也就是说，pop()返回的值，应该跟只有一个栈时的情况一样）。 进阶：实现一个popAt(int index)方法，根据指定的子栈，执行pop操作。
 * <p>
 * 当某个栈为空时，应当删除该栈。当栈中没有元素或不存在该栈时，pop，popAt应返回 -1.
 * <p>
 * 示例1:
 * <p>
 * 输入：
 * ["StackOfPlates", "push", "push", "popAt", "pop", "pop"]
 * [[1], [1], [2], [1], [], []]
 * 输出：
 * [null, null, null, 2, 1, -1]
 * 示例2:
 * <p>
 * 输入：
 * ["StackOfPlates", "push", "push", "push", "popAt", "popAt", "popAt"]
 * [[2], [1], [2], [3], [0], [0], [0]]
 * 输出：
 * [null, null, null, null, 2, 1, 3]
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/stack-of-plates-lcci
 */
public class 堆盘子 {
    class StackOfPlates {

        LinkedList<Stack> all = new LinkedList();
        // Stack<Stack> all = new Stack();
        int cap = 0;

        public StackOfPlates(int cap) {
            this.cap = cap;
        }

        public void push(int val) {
            if (cap > 0) {


                if (all.isEmpty()) {
                    Stack level = new Stack();
                    level.push(val);
                    all.add(level);
                } else {
                    Stack<Integer> topLevel = all.getLast();
                    if (topLevel.size() < cap) {
                        topLevel.push(val);
                    } else {
                        Stack level = new Stack();
                        level.push(val);
                        all.add(level);
                    }

                }
            }

        }

        public int pop() {
            if (all.isEmpty()) return -1;
            Stack<Integer> top = all.getLast();
            int size = top.pop();
            if (top.isEmpty()) {
                all.removeLast();
            }
            return size;
        }

        public int popAt(int index) {
            if (index > all.size() - 1) return -1;
            Stack<Integer> cur = all.get(index);
            int size = cur.pop();
            if (cur.isEmpty()) {
                all.remove(index);
            }
            return size;


        }

    }
}